package com.blankj.utilcode.util.time;

import android.annotation.SuppressLint;
import android.util.Log;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 主要功能：该工具用于App时间管理通用类
 *
 * @Prject: CommonUtilLibrary
 * @Package: com.jingewenku.abrahamcaijin.commonutil
 * @author: AbrahamCaiJin
 * @date: 2017年05月04日 14:13
 * @Copyright: 个人版权所有
 * @Company:
 * @version: 1.0.0
 */
@SuppressLint("SimpleDateFormat")
public class DateUtils {

    private final static ThreadLocal<SimpleDateFormat> dateFormater = new ThreadLocal<SimpleDateFormat>() {
        @Override
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    };
    private final static ThreadLocal<SimpleDateFormat> dateFormaterFull = new ThreadLocal<SimpleDateFormat>() {
        @Override
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
    };
    private static SimpleDateFormat yyyyMMddFormat = new SimpleDateFormat("yyyy-MM-dd");
    private static SimpleDateFormat hhmmssFormat = new SimpleDateFormat("HH:mm:ss");
    private static SimpleDateFormat yyyyMMddHHmmssFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 获得当前系统时间并转换成字符串(格式：yyyy-MM-dd HH:mm:ss:SSS)
     *
     * @return String 当前系统时间
     */
    public static String getSysDateByAll() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date());
    }


    /**
     * 系统时间转换成指定格式(格式：yyyy年MM月dd日 HH时mm分ss秒SSS毫秒)
     *
     * @return String 当前系统时间
     */
    public static String getSysDateByAllFormat() {
        return new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒SSS毫秒").format(new Date());
    }


    /**
     * 获得当前系统时间并转换成字符串(格式：yyyy-MM-dd HH:mm:ss)
     *
     * @return String 当前系统时间
     */
    public static String getSysDateByFull() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    }


    /**
     * 系统时间转换成指定格式(格式：yyyy年MM月dd日 HH时mm分ss秒)
     *
     * @return String 当前系统时间
     */
    public static String getSysDateByFullFormat() {
        return new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date());
    }


    /**
     * 获得当前系统时间并转换成字符串(格式：yyyy-MM-dd HH:mm)
     *
     * @return String 当前系统时间
     */
    public static String getSysDateByMinute() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date());
    }


    /**
     * 系统时间转换成指定格式(格式：yyyy年MM月dd日 HH时mm分)
     *
     * @return String 当前系统时间
     */
    public static String getSysDateByMinuteFormat() {
        return new SimpleDateFormat("yyyy年MM月dd日  HH时mm分").format(new Date());
    }

    /**
     * 获得当前系统时间并转换成字符串(格式：yyyy-MM-dd HH)
     *
     * @return String 当前系统时间
     */
    public static String getSysDateByHour() {
        return new SimpleDateFormat("yyyy-MM-dd HH").format(new Date());
    }


    /**
     * 系统时间转换成指定格式(格式：yyy年MM月dd日 HH时)
     *
     * @return String  当前系统时间
     */
    public static String getSysDateByHourFormat() {
        return new SimpleDateFormat("yyyy年MM月dd日  HH时").format(new Date());
    }


    /**
     * 获得当前系统时间并转换成字符串(格式：yyyy-MM-dd)
     *
     * @return String 当前系统时间
     */
    public static String getSysDate() {
        return new SimpleDateFormat("yyyy-MM-dd").format(new Date());
    }


    /**
     * 系统时间转换成指定格式(格式：yyy年MM月dd日)
     *
     * @return String  当前系统时间
     */
    public static String getSysDateFormat() {
        return new SimpleDateFormat("yyyy年MM月dd日").format(new Date());
    }


    /**
     * 通过时间字符串转换成指定格式
     *
     * @param date       时间值
     * @param dataFormat 格式为(yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)
     * @return String 返回格式化时间值
     */
    public static Date getFormatDateByString(String date, String dataFormat) {
        try {
            return new SimpleDateFormat(dataFormat).parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
            loge("DateUtils-->>getFormatDateByString", e.getMessage().toString());
            return null;
        }
    }


    /**
     * 通过时间字符串转换成指定格式
     *
     * @param date            时间值
     * @param dataFormat      格式为(yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)
     * @param chianDataFormat 格式可为(yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss) 或 (yyyy年MM月dd日 或 yyyy年MM月dd日 HH时mm分ss秒)
     * @return String 返回格式化时间值
     */
    public static String getFormatDateByString(String date, String dataFormat, String chianDataFormat) {
        try {
            return new SimpleDateFormat(chianDataFormat).format(new SimpleDateFormat(dataFormat).parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
            loge("DateUtils-->>getFormatDateByString", e.getMessage().toString());
            return null;
        }
    }


    /**
     * 通过时间字符串转换成指定格式(格式：yyyy年MM月dd日)
     *
     * @param date 时间值
     * @return String 返回格式化时间值
     */
    public static String getFormatDateByString(String date) {
        try {
            return new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
            loge("DateUtils-->>getFormatDateByString", e.getMessage().toString());
            return null;
        }
    }


    /**
     * 通过时间字符串转换成指定格式(格式：yyyy年MM月dd日 HH时mm分ss秒)
     *
     * @param date 时间值
     * @return String 返回格式化时间值
     */
    public static String getFormatDateFullByString(String date) {
        try {
            return new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
            loge("DateUtils-->>getFormatDateFullByString", e.getMessage().toString());
            return null;
        }
    }

    /**
     * 获取系统时间(格式：yyyyMMddHHmmss)
     *
     * @return String 返回时间
     */
    public static String getNowTime() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        return sdf.format(Calendar.getInstance().getTime());
    }

    /**
     * 获取系统时间(格式：yyyyMMddHHmmss)
     *
     * @return String 返回时间
     */
    public static String getStringTime() {
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        return df.format(new Date());
    }

    /**
     * 获取系统时间(格式：yyyyMMddHHmmssSSS)
     *
     * @return String 返回时间
     */
    public static String getStringTimeFull() {
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        return df.format(new Date());
    }

    /**
     * 获取系统时间(格式：yyyyMMddHHmmssSSS) + 四位随机码  = 共19位随机码
     *
     * @return String 返回时间
     */
    public static String getStringTimeFullRandom2() {
        return getStringTimeFull() + new Random().nextInt(100);
    }

    /**
     * 获取系统时间(格式：yyyyMMddHHmmssSSS) + 四位随机码  = 共21位随机码
     *
     * @return String 返回时间
     */
    public static String getStringTimeFullRandom4() {
        return getStringTimeFull() + new Random().nextInt(10000);
    }

    /**
     * 获取系统时间(格式：yyyyMMddHHmmss) + 四位随机码  = 共12位随机码
     *
     * @return String 返回时间
     */
    public static String getStringTimeRandom2() {
        return getStringTime() + new Random().nextInt(100);
    }

    /**
     * 获取系统时间(格式：yyyyMMddHHmmss) + 四位随机码  = 共14位随机码
     *
     * @return String 返回时间
     */
    public static String getStringTimeRandom4() {
        return getStringTime() + new Random().nextInt(10000);
    }

    /**
     * 获取系统时间(格式：yyyyMMddHHmmss) + 六位随机码   = 共16位随机码
     *
     * @return String 返回时间
     */
    public static String getStringTimeRandom6() {
        return getStringTime() + new Random().nextInt(1000000);
    }

    /**
     * 获取系统时间(格式：yyyyMMddHHmmss) + 八位随机码    = 共18位随机码
     *
     * @return String 返回时间
     */
    public static String getStringTimeRandom8() {
        return getStringTime() + new Random().nextInt(100000000);
    }

    /**
     * 获取参数时间的年
     *
     * @param date 时间值
     * @return String 返回年
     */
    public static String getSysYear(Date date) {
        return new SimpleDateFormat("yyyy").format(date).toString();
    }

    /**
     * 获取参数时间的年
     *
     * @param date 时间值
     * @return String 返回年
     */
    public static String getSysYear(String date) {
        return new SimpleDateFormat("yyyy").format(date).toString();
    }

    /**
     * 获取参数时间的月
     *
     * @param date 时间值
     * @return String 返回月
     */
    public static String getSysMonth(Date date) {
        return new SimpleDateFormat("MM").format(date).toString();
    }

    /**
     * 获取参数时间的月
     *
     * @param date 时间值
     * @return String 返回月
     */
    public static String getSysMonth(String date) {
        return new SimpleDateFormat("MM").format(date).toString();
    }

    /**
     * 获取参数时间的天
     *
     * @param date 时间值
     * @return String 返回天
     */
    public static String getSysDay(Date date) {
        return new SimpleDateFormat("dd").format(date).toString();
    }

    /**
     * 获取参数时间的天
     *
     * @param date 时间值
     * @return String 返回天
     */
    public static String getSysDay(String date) {
        return new SimpleDateFormat("dd").format(date).toString();
    }

    /**
     * 获取当前时间(格式：yyyy-MM-dd)
     *
     * @return String 返回时间
     */
    public static String getCalendarToday() {
        int year = 0;
        int moth = 0;
        int day = 0;
        Calendar c = Calendar.getInstance();
        year = c.get(Calendar.YEAR);
        moth = c.get(Calendar.MONTH) + 1;
        day = c.get(Calendar.DAY_OF_MONTH);
        return year + "-" + moth + "-" + day;
    }

    /**
     * 获取当前时间的下个月份(格式：yyyy-MM-dd)
     *
     * @return String 当前时间下个月份
     */
    public static String getCalendarTodayNextMonth() {
        int year = 0;
        int moth = 0;
        int day = 0;
        Calendar c = Calendar.getInstance();
        year = c.get(Calendar.YEAR);
        moth = c.get(Calendar.MONTH) + 1;
        day = c.get(Calendar.DAY_OF_MONTH) + 2;
        return year + "-" + moth + "-" + day;
    }

    /**
     * 判断日期是否属于今天日期(精确到天)
     *
     * @param sDate 日期值
     * @return boolean 返回true表示是，false表示不是
     */
    public static boolean getSysIsToday(String sDate) {
        boolean falg = false;
        try {
            Date date = null;
            date = dateFormaterFull.get().parse(sDate);
            Date today = new Date();
            if (date != null) {
                String nowDate = dateFormater.get().format(today);
                String timeDate = dateFormater.get().format(date);
                if (nowDate.equals(timeDate)) {
                    falg = true;
                }
            }
        } catch (ParseException e) {
            e.printStackTrace();
            loge("DateUtils-->>getSysIsToday", e.getMessage().toString());
        }
        return falg;
    }

    /**
     * 检查日期是否有效
     *
     * @param year  年
     * @param month 月
     * @param day   日
     * @return boolean
     */
    public static boolean getDateIsTrue(String year, String month, String day) {
        try {
            String data = year + month + day;
            SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyyMMdd");
            simpledateformat.setLenient(false);
            simpledateformat.parse(data);
        } catch (ParseException e) {
            e.printStackTrace();
            loge("DateUtils-->>getDateIsTrue", e.getMessage().toString());
            return false;
        }
        return true;
    }

    /**
     * 判断两个字符串日期的前后
     *
     * @param strdate1 字符串时间1
     * @param strdate2 字符串时间2
     * @return boolean
     * 日期与时间
     */
    public static boolean getDateIsBefore(String strdate1, String strdate2) {
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            logi("DateUtils-->>getDateIsBefore-->>strdate1: ", strdate1);
            logi("DateUtils-->>getDateIsBefore-->>strdate2: ", strdate2);
            return df.parse(strdate1).before(df.parse(strdate2));
        } catch (ParseException e) {
            e.printStackTrace();
            loge("DateUtils-->>getDateIsBefore", e.getMessage().toString());
            return false;
        }
    }

    /**
     * 判断两个字符串日期的前后
     *
     * @param strdate1 字符串时间1
     * @param strdate2 字符串时间2
     * @return boolean
     */
    public static boolean getDateIsEqual(String strdate1, String strdate2) {
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return df.parse(strdate1).equals(df.parse(strdate2));
        } catch (ParseException e) {
            e.printStackTrace();
            loge("DateUtils-->>getDateIsBefore", e.getMessage().toString());
            return false;
        }
    }

    /**
     * 判断两个字符串日期的前后
     *
     * @param Longdate1 字符串时间1
     * @param Longdate2 字符串时间2
     * @return boolean
     */
    public static boolean getDateIsBefore(Long Longdate1, Long Longdate2) {
        try {
            logi("DateUtils-->>getDateIsBefore-->>strdate1: ", Longdate1 + "");
            logi("DateUtils-->>getDateIsBefore-->>strdate2: ", Longdate2 + "");
            Longdate1 = (null == Longdate1) ? 0 : Longdate1;
            Longdate2 = (null == Longdate2) ? 0 : Longdate2;
            return Longdate1 > Longdate2 ? true : false;
        } catch (Exception e) {
            e.printStackTrace();
            loge("DateUtils-->>getDateIsBefore", e.getMessage().toString());
            return false;
        }
    }

    /**
     * 判断两个时间日期的前后
     *
     * @param date1 日期1
     * @param date2 日期2
     * @return boolean
     */
    public static boolean getDateIsBefore(Date date1, Date date2) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return getDateIsBefore(df.format(date1), df.format(date2));
    }

//	public static int getDateIsBefore(String DATE1, String DATE2) {
//
//		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
//		try {
//			Date dt1 = df.parse(DATE1);
//			Date dt2 = df.parse(DATE2);
////			if (dt1.getTime() > dt2.getTime()) {
////				return 1;
////			} else if (dt1.getTime() < dt2.getTime()) {
////				return -1;
////			} else {
////				return 0;
////			}
////
//
//			if(getDateIsBefore(dt1 , dt2)){
//				return -1;
//			}else{
//				return 1;
//			}
//		} catch (Exception exception) {
//			exception.printStackTrace();
//		}
//		return 0;
//	}


    /**
     * 判断两个字符串日期的前后
     *
     * @param strdate1 字符串时间1
     * @param strdate2 字符串时间2
     * @return boolean
     * 日期比较
     * <p>
     * create by huangcheng
     */
    public static boolean getDateIsBeforeYYMMDD(String strdate1, String strdate2) {
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            logi("DateUtils-->>getDateIsBefore-->>strdate1: ", strdate1);
            logi("DateUtils-->>getDateIsBefore-->>strdate2: ", strdate2);
            return df.parse(strdate1).before(df.parse(strdate2));
        } catch (ParseException e) {
            e.printStackTrace();
            loge("DateUtils-->>getDateIsBefore", e.getMessage().toString());
            return false;
        }
    }

    /**
     * 日期格式字符串转换成时间戳
     * <p>
     * create by fuxiaosong
     *
     * @return
     */
    public static long date2TimeStamp(String date, SimpleDateFormat dateFormat) {
        try {
            return dateFormat.parse(date).getTime() / 1000;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 计算两个日期之间相差的分钟
     * <p>
     * create by fuxiaosong
     */
    public static long minuteBetweenTwoDate(String dateBegin, String dateEnd) {
        long millisBegin = date2TimeStamp(dateBegin, yyyyMMddHHmmssFormat);
        long millisEnd = date2TimeStamp(dateEnd, yyyyMMddHHmmssFormat);
        return (millisEnd - millisBegin) / 60;
    }

    /**
     * @param @param  dateDefault
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: getStringByDateDefault
     * @Description: 将"Tue Apr 18 15:41:37 CST 2017"转成"2017-04-18 15:41:37"
     */
    public static String getStringByDateDefault(String dateDefault) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
            Date d = sdf.parse(dateDefault);
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d);
        } catch (ParseException e) {
            // TODO: handle exception
            e.printStackTrace();
        }

        return null;
//	       SimpleDateFormat sdf1 = new SimpleDateFormat ("EEE MMM dd HH:mm:ss Z yyyy", Locale.UK);
//                try {
//                    Date date = sdf1.parse(dateDefault);
//                    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                   return sdf.format(date);
//                } catch (ParseException e) {
//                    // TODO Auto-generated catch block
//                    e.printStackTrace();
//                }
    }

    /**
     * @param time 2017年5月5日15时41分
     * @return String
     * @Description:2017年5月5日15时41分将年月日时分秒数字单独分割出来：2017 5 5 15 41
     */
    public static String getAloneTime(String time) {
        String regex = "(\\d{4})年(\\d{1,2})月(\\d{1,2})日(\\d{1,2})时(\\d{1,2})";
        Matcher m = Pattern.compile(regex).matcher(time);
        if (m.find()) {
            return m.group(1) + "," + m.group(2) + "," + m.group(3) + "," + m.group(4) + "," + m.group(5);
        }
        return null;
    }

    public static void logi(String tag, String msg) {
        Log.i(tag, msg);
    }

    public static void loge(String tag, String msg) {
        Log.e(tag, msg);
    }
}
